/*
 * Copyright (c) 2025, 大连理工大学 (Dalian University of Technology)
 *
 * Licensed under the Mulan PSL v2.
 * You can use this file according to the terms and conditions of the Mulan PSL v2.
 * You may obtain a copy of the License at
 *
 *     http://license.coscl.org.cn/MulanPSL2
 *
 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. SEE THE MULAN PSL v2
 * FOR MORE DETAILS.
 */

/*
 * @Author: qiulin_JXGM ql1746365080@gmail.com
 * @Date: 2024-09-05 14:30:15
 * @LastEditors: wxc superjava@qq.com
 * @LastEditTime: 2024-09-29 13:07:53
 * @FilePath: /SGFEM/DBManager/DBManager/Service/Result/ResultDomainsService.h"
 */

#pragma once
#include "Utility/Algebra/Matrix.h"

#include "DBManager/Common/DBManagerExport.h"
#include "DBManager/Common/DomainRequest.h"
#include "DBManager/Common/ServiceMacro.h"
#include "DBManager/DBServiceFactory.h"
#include "DBManager/IRepository/Result/IResultDomainsRepository.h"
#include "DBManager/IService/Result/IResultDomainsService.h"

SG_DBMANAGER_NAMESPACE_OPEN

/**
 * @class ResultDomainsService
 * @brief 结果域服务类，用于处理 DOMAINS 数据的相关操作。
 *
 * 该类提供了添加 `ResultDomains` 实体及根据给定键查找域 ID 的功能。
 */

class DBManager_DECLSPEC ResultDomainsService : IResultDomainsService
{
    using DataType = SG::DataStructure::Post::ResultDomains;
    using IRepos   = IResultDomainsRepository;

  public:
    FUNCTION_Count ();
    /**
     * @brief 构造函数
     *
     * 使用指定的结果域仓库接口初始化服务类。
     *
     * @param repos 结果域仓库接口，用于数据操作。
     */
    explicit ResultDomainsService (DBServiceFactory* const dbServiceFactory, IRepos& repos);

    /**
     * @brief 析构函数
     *
     * 清理 `ResultDomainsService` 对象。
     */
    ~ResultDomainsService () = default;

    /**
     * @brief 添加 ResultDomains 实体
     *
     * 将一个 `ResultDomains` 实体添加到存储库中。
     * 如果entity的m_Id为0，则程序为其自动分配id
     * 如果entity的m_Id非0，则程序判断entity的m_Id不大于当前前仓库中最大domainid则返回false，反之返回true
     *
     * @param entity 要添加的 `ResultDomains` 实体。
     * @return 如果添加成功返回 `true`，否则返回 `false`。
     */
    SG::DataStructure::Common::Status Add (DataType& entity) override;
    SG::DataStructure::Common::Status MAdd (std::vector<DataType>& entity) override;

    /// @brief 获取所有DOMAINID
    /// @return
    std::vector<SG::DataStructure::Common::Id> GetAllId () override;

    /// @brief 根据ID获取DOMAINData
    /// @param id
    /// @return
    SG::DataStructure::Common::Status FindById (SG::DataStructure::Common::Id id, DataType& domain) override;

    /**
     * @brief 获取指定键的域 ID
     *
     * 寻找在仓库中与findKey除m_id外其余对象相等的元素，并将结果赋值给 `domainID`。
     *
     * @param request 用于查找的 `ResultDomains` 键值。
     * @param _OUT domainID 查找到的域 ID，输出参数。
     * @return 如果找到匹配的域 ID 返回 `true`，否则返回 `false`。
     */
    SG::DataStructure::Common::Status GetDomainId (const SG::DBManager::Post::DomainRequest& request,
                                                   _OUT SG::DataStructure::Common::Id& domainID);
    /**
     * @brief 根据条件查找domain
     *
     * @param    request
     * @param    domain
     * @author   wxc
     * @date     2024.11.25
     */
    SG::DataStructure::Common::Status Find (const SG::DBManager::Post::DomainRequest& request,
                                            SG::DataStructure::Post::ResultDomains&   domain);

    /// @brief 获取所有domains
    /// @return
    const std::vector<SG::DataStructure::Post::ResultDomains> GetAllData ();

    /**
     * @brief    根据DomainRequest 创建Domain数据
     *
     * @param    request
     * @return
     * @author   wuxingchuang
     * @date     2025.03.06
     */
    SG::DataStructure::Common::Id AddFromRequest (const SG::DBManager::Post::DomainRequest& request) override;

  private:
    /**
     * @brief 添加该表数据至数据库
     *
     * @param    entity
     * @return
     * @author   wuxingchuang
     * @date     2025.03.06
     */
    SG::DataStructure::Common::Status AddMeta (DataType& entity);

  private:
    IRepos&                 m_repository;
    DBServiceFactory* const m_dbServiceFactory;  /// 当前用到的数据库
};

SG_DBMANAGER_NAMESPACE_CLOSE